package Day08.RPCDemo02.src.cn.tedu.calc;


import Day08.RPCDemo02.src.cn.tedu.rpc.RPCReq;
import Day08.RPCDemo02.src.cn.tedu.rpc.RPCResp;
import Day08.RPCDemo02.src.cn.tedu.utils.NIOUtils;
import Day08.RPCDemo02.src.cn.tedu.utils.SeriUtils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class CalcProxy {
    private CalcProxy() {}

    public static CalcIntf getCalc(){
        CalcIntf calc = (CalcIntf) Proxy.newProxyInstance(
                CalcProxy.class.getClassLoader(),
                new Class[]{CalcIntf.class},
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        //将方法调用信息保存到请求对象中
                        RPCReq req = new RPCReq(method.getDeclaringClass(),method.getName(), method.getParameterTypes(), args);
                        //序列化对象为字节数组
                        byte[] reqData = SeriUtils.obj2Bytes(req);
                        //发送字节数组到服务器，接收服务器返回的数组
                        byte[] respData = NIOUtils.call(reqData);
                        //反序列化为响应对象
                        RPCResp resp = (RPCResp) SeriUtils.bytes2Obj(respData);
                        //从响应对象中获取结果
                        Object retObj = resp.getRetObj();
                        //返回结果
                        return retObj;
                    }
                }
        );
        return calc;
    }
}
